package com.tools.web.email;

import com.tools.common.object.Note;

import java.util.Locale;

/**
 * 邮箱传输协议的枚举类
 * */
@Note("邮箱传输协议的枚举类")
public enum MailProtocolEnum {

    SMTP("smtp", "smtp.{}.com","简单邮件传输协议，提供由源地址到目的地址传送邮件的规则。【发送邮件推荐用它】。注意：需要在个人邮箱账户处开启服务。"),
    POP3("pop3", "pop3.{}.com","允许客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等)，不会反馈到服务器上。注意：需要在个人邮箱账户处开启服务。"),
    IMAP("imap", "imap.{}.com","提供邮箱服务器与电子邮件客户端之间的双向通信，客户端的操作都会同步反应到服务器上，【接收邮件推荐用它】。注意：需要在个人邮箱账户处开启服务。");

    @Note("邮箱协议的名称")
    private final String name;

    @Note("邮箱服务器地址的格式")
    private final String hostPattern;

    @Note("邮件协议的说明")
    private final String explain;

    MailProtocolEnum(String name, String hostPattern, String explain) {
        this.name = name;
        this.hostPattern = hostPattern;
        this.explain = explain;
    }

    public String getName() {
        return name;
    }

    public String getExplain() {
        return explain;
    }

    @Override
    public String toString() {
        return this.name();
    }

    @Note("使用邮箱运营商的名称替换占位符，返回与协议对应的服务器地址，如: qq -> smtp/imap/pop3.qq.com")
    public String getHost(String mailISP) {
        if(mailISP == null || mailISP.isEmpty()) throw new NullPointerException("请输入正确的邮箱运营商表示，如: qq、163、gmail 等");
        return this.hostPattern.replace("{}", mailISP);
    }

    public boolean eq(String s) {
        return this.name.equals(s);
    }

    public boolean ignoreCaseEq(String s) {
        return this.name.equalsIgnoreCase(s);
    }


    @Note("安全地根据邮箱传输协议的名称获取枚举实例，获取不到不会抛异常")
    public static MailProtocolEnum getEnumSafe(String name) {
        switch (name.toLowerCase(Locale.ROOT)) {
            case "smtp": return SMTP;
            case "pop3": return POP3;
            case "imap": return IMAP;
            default: return null;
        }
    }


    @Note("根据邮箱传输协议的名称获取枚举实例，获取不到会抛异常")
    public static MailProtocolEnum getEnum(String name) {
        MailProtocolEnum protocol = getEnumSafe(name);
        if(protocol == null) throw new IllegalArgumentException("不知道 " + name + "对应什么枚举");
        return protocol;
    }
}
